package top.lishuoboy.mybatis.mapper;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import top.lishuoboy.mybatis.bean.User;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public interface UserMapper {
    User selectById(Integer id);

    // 注解方式，参数同名
    @Select(value = "select * from user where id = #{id}")
    User selectById2(Integer id);

    // 注解方式，只有一个参数，可以不同名字
    @Select(value = "select * from user where id = #{id2}")
    User selectById2_1(Integer id3);

    // 注解方式，多个参数必须同名，否则用@Param("id")
    @Select(value = "select * from user where id != #{id} and id != #{id2}")
    User selectById2_2(Integer id2, Integer id);

    // 注解方式，多个参数必须同名，否则用@Param("id")
    @Select(value = "select * from user where id != #{id} and id != #{id2}")
    User selectById2_3(Integer id2, @Param("id") Integer id3);

    User selectById3(Integer id);

    List<User> selectList();

    // 返回对象唯一个，但是查到多个，报错：Expected one result (or null) to be returned by selectOne(), but found: 3
    User selectList2();

    int insert(User user);

    int updateById(User user);

    int deleteById(int id);

    List<User> selectColumnAlias1();

    List<User> selectColumnAlias2();

    List<User> selectColumnAlias3();

    // 重复sql片段复用
    List<User> selectRepeatSql();

    // 万能 Map1
    List<Map> selectMap();

    // 万能 Map2
    List<LinkedHashMap> selectLinkedHashMap();

    List<User> selectCache();

    List<User> dynamicIf(User user);

    List<User> dynamicChoose(User user);

    List<User> dynamicWhere1(User user);

    List<User> dynamicWhere2(User user);

    List<User> dynamicWhere3(User user);

    int dynamicSetTrim(User user);

    int dynamicSetTrim2(User user);

    List<User> dynamicForeachIn(List<Integer> idList);

    List<User> dynamicForeachIn2(Object[] idArr);

    List<User> dynamicForeachIn3(Map<String, String> map);

    List<User> selectLike(String str);

    // 容易被sql注入
    List<User> selectLike2(String str);

    // 容易被sql注入
    List<User> selectLike3(String str);

    // 容易被sql注入
    List<User> selectLike4(String str);

    int insertSingle(User user);

    int insertBatch(List<User> userList);

    List<User> selectPage1(int index, int pageSize);

    /**
     * 淘汰 本质是从库里查全量，内存里分页，太耗资源
     *
     * @return
     */
    List<User> selectPage2();

    int insertGeneratedKeys(User user);

    int insertBatchGeneratedKeys(List<User> userList);

    List<User> _$(int id);

    List<User> discriminator();

    List<User> bind(String pwd);

    List<User> pageHelperHelloWorld();

    List<User> pageHelper();

    //第四种，参数方法调用。 存在以下 Mapper 接口方法，你不需要在 xml 处理后两个参数
    List<User> pageHelper(User user, @Param("pageNum") Integer pageNum, @Param("pageSize") Integer pageSize);

    //第五种，参数对象
    List<User> pageHelper(User user);


}